package com.apobates.jforum.grief.aurl.utils.defend;

import java.util.ArrayList;
import java.util.List;

/**
 * 多值Assertion
 * 注意: 一个目标只有多条消息, 遇到第一个失败规则后将收集未校验的失败消息
 * @param <T> 目标类型
 */
public class MultiCompleteAssertion<T> extends MultiAssertion<T> {

    MultiCompleteAssertion(T[] values) {
        super(values);
    }

    @Override
    public List<AssertResult<T>> asserte(PredicateQueue<T> predicateQueue) {
        List<AssertResult<T>> res=new ArrayList<>();

        for (int index=0;index<values.length;index++) {
            boolean hasError=false;
            T tmpTarget = values[index];
            for (AssertPredicate<T> condition: predicateQueue.getConditions()) {
                if(!hasError) {
                    if (!condition.predicate(tmpTarget)) {
                        String message = condition.getError().concat(", 参数:" + index);
                        res.add(new AssertResult(tmpTarget, false, message, index, condition.getLabel()));
                        hasError = true;
                    }
                }else{
                    res.add(new AssertResult(tmpTarget, false, condition.getError(), index, condition.getLabel()));
                }
            }
        }
        return res;
    }
}
